package god;

public class J14Ex46CalendarV2 {
	public static void main(String[] args) {
		// 서기 1년 1월 1일은 [월]요일
		// 1년은 일반적으로 365일 (평년)
		// 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 평년일 때 각 달의 일 수
		// 하지만, 1년이 366일인 경우도 있음 (윤년)
		// 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 윤년일 때 각 달의 일 수

		// 윤년 : 4로 나누어지고, 100으로 나누어 떨어지지 않거나
		// 400으로 나누어 떨어지는 연도

		// 0 : 일 ~ 6 : 토요일

		// 위 내용을 토대로 1년 12월 31일의 요일은?
		int myday;
		int allday = 365;
		int leapyear = 0;
		int cyear = 1;

		// 윤년 횟수 계산
		if ((cyear % 4 == 0 && cyear % 100 != 0) || (cyear % 400 == 0)) {
			++leapyear;
		}

		// 총일수 계산 후 7로 나눈 나머지 계산
		myday = ((cyear * allday) + leapyear) % 7;
		
		System.out.println( "서기 1-12-31의 요일은 " + myday );
		
		// 2014-12-31의 요일은?
		
		cyear = 2014;
		leapyear = 0;
		
		// 1년 부터 2014년 까지의 윤년 계산 후 윤년만큼 + 시켜서 총일수 계산 후 요일 구하기
		for ( int i = 1; i <= cyear; ++i ) {
			if (( i % 4 == 0 && i % 100 != 0 ) || ( i % 400 == 0 )) {
				++leapyear;
			}
		}
		myday = ((cyear * allday) + leapyear) % 7;	
		
		System.out.println( "서기 2014-12-31의 요일은 " + myday );
		
		// 이 식에 +1을 해서 다음 해의 달력을 만들 수 있음
		// 위의 식을 한줄로 만들면 ( ( ( year-1 ) * 365 + ( year-1 ) / 100 + ( year-1 ) / 400 ) ) % 7 
		
		// 줄바꿈 처리를 위한 변수 선언 ( 7번 출력시 줄바꿈)
		int linecount = 0;
		// 달력 출력
		String result = "\n\t\t\t" + ( cyear + 1 ) + "년 1월 \n" + "\t-------------------------------\n" + "\t일\t월\t화\t수\t목\t금\t토\n";
		// 공백 처리
		if ( myday > 0 ) {
			for( int j = 0; j <= myday; ++j) {
				result += "\t";
				++linecount;
			}
		}
		// 날짜 출력
		for ( int k = 1; k <= 31; ++k) {
			result += "\t" + k;
			++linecount;
			if ( linecount % 7 == 0 ) { result += "\n"; }
		}
		System.out.println(result);
	}
}
